{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第四次练习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "+ 请务必交到exer4文件夹下，谢绝交到master下\n",
    "+ 请不要改动任何文件，拜托\n",
    "+ 请在10月30日前提交。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "请写一下姓名和学号：\n",
    "+ 姓名  黄德辉\n",
    "+ 学号  0165241"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 题目一\n",
    "一般的歌，分为主歌和副歌部分。副歌有重复，对比两大功能。这就是A－B的基本曲式形式结构。  \n",
    "请找一首你的主打歌，把歌词打印出来，重复的副歌部分，请写一个函数，调用函数打印出来。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "歌曲：东西\n",
      "歌手：林俊呈\n",
      "作曲：何泽镔\n",
      "作词：何泽镔/十一\n",
      "来源：网易云音乐\n",
      "\n",
      "收到需要赶快回复的信息\n",
      "那就考虑看看是不是要回应你\n",
      "如果说以后都不用对你讲客气\n",
      "我就等着对你说一句欢迎光临\n",
      "\n",
      "在无人的海岛上有美丽风景\n",
      "想有梦里的竹蜻蜓带我去远行\n",
      "去到你心里的那个神秘的巴黎\n",
      "再想和你生一群baby\n",
      "\n",
      "我开始美丽的际遇\n",
      "你来自东或西\n",
      "都没有太大的关系\n",
      "都听你\n",
      "因为始终和你前进\n",
      "回忆并肩旅行\n",
      "我愿意陪着你去东和西\n",
      "\n",
      "收到需要赶快回复的信息\n",
      "那就考虑看看是不是要回应你\n",
      "如果说以后都不用对你讲客气\n",
      "我就等着对你说一句欢迎光临\n",
      "\n",
      "在无人的海岛上有美丽风景\n",
      "想有梦里的竹蜻蜓带我去远行\n",
      "去到你心里的那个神秘的巴黎\n",
      "再想和你生一群baby\n",
      "\n",
      "我开始美丽的际遇\n",
      "你来自东或西\n",
      "都没有太大的关系\n",
      "都听你\n",
      "因为始终和你前进\n",
      "回忆并肩旅行\n",
      "我愿意陪着你去东和西\n",
      "\n",
      "我开始美丽的际遇\n",
      "你来自东或西\n",
      "都没有太大的关系\n",
      "都听你\n",
      "因为始终和你前进\n",
      "回忆并肩旅行\n",
      "我愿意陪着你去东和西\n",
      "\n",
      "我开始美丽的际遇\n",
      "你来自东或西\n"
     ]
    }
   ],
   "source": [
    "def para_shou():\n",
    "    para = [\"\\n收到需要赶快回复的信息\",\n",
    "              \"那就考虑看看是不是要回应你\",\n",
    "              \"如果说以后都不用对你讲客气\",\n",
    "              \"我就等着对你说一句欢迎光临\",]\n",
    "    for item in para:\n",
    "        print(item)\n",
    "    \n",
    "def para_zai():\n",
    "    para = [\"\\n在无人的海岛上有美丽风景\",\n",
    "            \"想有梦里的竹蜻蜓带我去远行\",\n",
    "            \"去到你心里的那个神秘的巴黎\",\n",
    "            \"再想和你生一群baby\",]\n",
    "    for item in para:\n",
    "        print(item)\n",
    "        \n",
    "def para_wo():\n",
    "    para = [\"\\n我开始美丽的际遇\",\n",
    "           \"你来自东或西\",\n",
    "           \"都没有太大的关系\",\n",
    "           \"都听你\",\n",
    "           \"因为始终和你前进\",\n",
    "            \"回忆并肩旅行\",\n",
    "            \"我愿意陪着你去东和西\",]\n",
    "    for item in para:\n",
    "        print(item)\n",
    "    return para\n",
    "\n",
    "#打印歌曲信息\n",
    "info = {\"歌曲\":\"东西\",\n",
    "       \"歌手\":\"林俊呈\",\n",
    "       \"作曲\":\"何泽镔\",\n",
    "        \"作词\":\"何泽镔/十一\",\n",
    "        \"来源\":\"网易云音乐\",\n",
    "       }\n",
    "for first, last in info.items():\n",
    "    print(first + \"：\" + last)\n",
    "\n",
    "#3段副歌循环两次\n",
    "for i in range(2):\n",
    "    para_shou()\n",
    "    para_zai()\n",
    "    para_wo()\n",
    "    \n",
    "#这段要在循环一次，顺便获取这段的前两句作为结尾\n",
    "para = para_wo()\n",
    "\n",
    "#打印最后一段的前两句\n",
    "for i in range(2):\n",
    "    print(para[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 题目二\n",
    "请写一个函数，能够计算均值、样本方差和n(自己写公式哦)。\n",
    "每次输入十个以上的数字，能够输出上述三个统计量。\n",
    "至少调用两次。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输入一组10个以上的数字，每次输一个数字！\n",
      "Enter 'q' to quit.\n",
      "\n",
      "请输入阿拉伯数字: 1\n",
      "\n",
      "请输入阿拉伯数字: 2\n",
      "\n",
      "请输入阿拉伯数字: 3\n",
      "\n",
      "请输入阿拉伯数字: 4\n",
      "\n",
      "请输入阿拉伯数字: 5\n",
      "\n",
      "请输入阿拉伯数字: 6\n",
      "\n",
      "请输入阿拉伯数字: 7\n",
      "\n",
      "请输入阿拉伯数字: 8\n",
      "\n",
      "请输入阿拉伯数字: 9\n",
      "\n",
      "请输入阿拉伯数字: \n",
      "好好输！\n",
      "\n",
      "请输入阿拉伯数字: 10\n",
      "\n",
      "请输入阿拉伯数字: 11\n",
      "\n",
      "请输入阿拉伯数字: q\n",
      "\n",
      "均值：6.0\n",
      "样本方差：11.0\n",
      "n：11\n"
     ]
    }
   ],
   "source": [
    "#输入\n",
    "def input_nums():\n",
    "    #接收数字的数组\n",
    "    nums = []\n",
    "    print(\"输入一组10个以上的数字，每次输一个数字！\" + \"\\nEnter 'q' to quit.\")\n",
    "\n",
    "    #无限循环录入，加入退出机制\n",
    "    while True:\n",
    "        num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #判断输入是否为数字,若不是，则重新录入\n",
    "        while num.isdigit() == False and num != 'q':\n",
    "            num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #输入q就退出\n",
    "        if num == 'q':\n",
    "            break\n",
    "        #将数字加入数组中\n",
    "        nums.append(int(num))\n",
    "    return nums\n",
    "\n",
    "#计算统计量\n",
    "def stat(nums):\n",
    "        try:\n",
    "            sum1 = 0.0\n",
    "            sum2 = 0.0\n",
    "            n = len(nums)\n",
    "            for i in nums:\n",
    "                sum1 = sum1 + i\n",
    "                ave = sum1 / n\n",
    "            for i in nums:\n",
    "                sum2 = sum2 + (ave - i)**2\n",
    "                variance = sum2 / (n - 1)\n",
    "            print(\"\\n均值：%s\" % ave + \"\\n样本方差：%s\" % variance + \"\\nn：%s\" % n)\n",
    "        except:\n",
    "            print(\"Unknown Error!\")\n",
    "\n",
    "def main():\n",
    "    nums = input_nums()\n",
    "    stat(nums)\n",
    "    \n",
    "main()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 题目三\n",
    "刚才那个函数，默认的是输出均值、样本方差和n，请在后面添加一个关键词参数，让这个函数可以选择输出样本标准差或方差。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输入一组10个以上的数字，每次输一个数字！\n",
      "Enter 'q' to quit.\n",
      "\n",
      "请输入阿拉伯数字: 1\n",
      "\n",
      "请输入阿拉伯数字: 2\n",
      "\n",
      "请输入阿拉伯数字: 3\n",
      "\n",
      "请输入阿拉伯数字: q\n",
      "\n",
      "方差or标准差？\n",
      "方差：1\n",
      "标准差：2\n",
      "\n",
      "请输入1或2：2\n",
      "均值：2.0\n",
      "n：3\n",
      "标准差：1.0\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#输入\n",
    "def input_nums():\n",
    "    #接收数字的数组\n",
    "    nums = []\n",
    "    print(\"输入一组10个以上的数字，每次输一个数字！\")\n",
    "    print(\"Enter 'q' to quit.\")\n",
    "    \n",
    "    #无限循环录入，加入退出机制\n",
    "    while True:\n",
    "        num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #判断输入是否为数字,若不是，则重新录入\n",
    "        while num.isdigit() == False and num != 'q':\n",
    "            num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #输入q就退出\n",
    "        if num == 'q':\n",
    "            break\n",
    "        #将数字加入数组中\n",
    "        nums.append(int(num))\n",
    "    return nums\n",
    "\n",
    "#选择性输出\n",
    "def describe_nums(ave, n, varc = None, sdev = None):\n",
    "    print(\"均值：%s\" % ave)\n",
    "    print(\"n：%s\" % n)\n",
    "    if varc:\n",
    "        print(\"方差：%s\" % varc)\n",
    "    if sdev:\n",
    "        print(\"标准差：%s\" % sdev)\n",
    "    print(\"\\n\")\n",
    "\n",
    "#计算统计量\n",
    "def stat(nums):\n",
    "        try:\n",
    "            sum1 = 0.0\n",
    "            sum2 = 0.0\n",
    "            n = len(nums)\n",
    "            #平均数\n",
    "            for i in nums:\n",
    "                sum1 = sum1 + i\n",
    "                ave = sum1 / n\n",
    "            #样本方差\n",
    "            for i in nums:\n",
    "                sum2 = sum2 + (ave - i)**2\n",
    "                varc = sum2 / (n - 1)\n",
    "            #样本标准差\n",
    "            sdev = varc ** 0.5\n",
    "            \n",
    "            print(\"\\n方差or标准差？\" + \"\\n方差：1\\n标准差：2\")\n",
    "            choice = input(\"\\n请输入1或2：\")\n",
    "            while choice != \"1\" and choice != \"2\":\n",
    "                choice = input(\"\\n请输入1或2：\")\n",
    "            if choice == '1':\n",
    "                describe_nums(ave, n, varc=varc)\n",
    "            elif choice == '2':\n",
    "                describe_nums(ave, n, sdev=sdev)\n",
    "            else:\n",
    "                print(\"输入错误！\")\n",
    "\n",
    "        except:\n",
    "            print()\n",
    "\n",
    "def main():\n",
    "    nums = input_nums()\n",
    "    stat(nums)\n",
    "    \n",
    "main()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 题目四\n",
    "刚才那个函数，请再增加三个关键词参数，让这个参数可以选择输出均值的标准误、最大值、最小值或不输出这三个统计量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输入一组10个以上的数字，每次输一个数字！\n",
      "Enter 'q' to quit.\n",
      "\n",
      "请输入阿拉伯数字: 1\n",
      "\n",
      "请输入阿拉伯数字: 2\n",
      "\n",
      "请输入阿拉伯数字: 3\n",
      "\n",
      "请输入阿拉伯数字: q\n",
      "\n",
      "要输出均值的标准误、最大值、最小值这三个统计量么？\n",
      "输出：y\n",
      "不输出：n\n",
      "\n",
      "请输入小写字母'y'或'n'：4\n",
      "\n",
      "请输入小写字母'y'或'n'：d\n",
      "\n",
      "请输入小写字母'y'或'n'：y\n",
      "均值： 2.0\n",
      "n： 3\n",
      "方差： 1.0\n",
      "标准误: 0.5773502691896258\n",
      "最大值: 3\n",
      "最小值: 1\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#输入\n",
    "def input_nums():\n",
    "    #接收数字的数组\n",
    "    nums = []\n",
    "    print(\"输入一组10个以上的数字，每次输一个数字！\")\n",
    "    print(\"Enter 'q' to quit.\")\n",
    "    \n",
    "    #无限循环录入，加入退出机制\n",
    "    while True:\n",
    "        num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #判断输入是否为数字,若不是，则重新录入\n",
    "        while num.isdigit() == False and num != 'q':\n",
    "            num = input(\"\\n请输入阿拉伯数字: \")\n",
    "        #输入q就退出\n",
    "        if num == 'q':\n",
    "            break\n",
    "        #将数字加入数组中\n",
    "        nums.append(int(num))\n",
    "    return nums\n",
    "\n",
    "#选择性输出\n",
    "def describe_nums(ave, n, varc, **kwargs):\n",
    "    print(\"均值：\", ave)\n",
    "    print(\"n：\", n)\n",
    "    print(\"方差：\", varc)\n",
    "    for key in kwargs:\n",
    "        print(\"%s: %s\" % (key.title(), kwargs[key]))\n",
    "    print(\"\\n\")\n",
    "\n",
    "#计算统计量\n",
    "def stat(nums):\n",
    "        try:\n",
    "            sum1 = 0.0\n",
    "            sum2 = 0.0\n",
    "            n = len(nums)\n",
    "            #平均数\n",
    "            for i in nums:\n",
    "                sum1 = sum1 + i\n",
    "                ave = sum1 / n\n",
    "            #样本方差\n",
    "            for i in nums:\n",
    "                sum2 = sum2 + (ave - i)**2\n",
    "                varc = sum2 / (n - 1)\n",
    "            #样本标准差\n",
    "            sdev = varc ** 0.5\n",
    "            #均值的标准误\n",
    "            sder = sdev / (n ** 0.5)\n",
    "            #最大值\n",
    "            max_nums = max(nums)\n",
    "            #最小值\n",
    "            min_nums = min(nums)\n",
    "            \n",
    "            print(\"\\n要输出均值的标准误、最大值、最小值这三个统计量么？\" + \"\\n输出：y\\n不输出：n\")\n",
    "            choice = input(\"\\n请输入小写字母'y'或'n'：\")\n",
    "            while choice != \"y\" and choice != \"n\":\n",
    "                choice = input(\"\\n请输入小写字母'y'或'n'：\")\n",
    "            if choice == 'y':\n",
    "                describe_nums(ave, n, varc, 标准误=sder, 最大值=max_nums, 最小值=min_nums)\n",
    "            elif choice == 'n':\n",
    "                describe_nums(ave, n, varc)\n",
    "            else:\n",
    "                print(\"输入错误！\")\n",
    "\n",
    "        except:\n",
    "            print()\n",
    "\n",
    "def main():\n",
    "    nums = input_nums()\n",
    "    stat(nums)\n",
    "    \n",
    "main()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
